import org.junit.jupiter.api.Test;

import java.time.*;
import java.time.format.DateTimeFormatter;


/**
 * @author xufeng
 * @date 2023-04-27
 */
public class YearDemo {

    /**
     * MAX_VALUE：year对象能表示的最大年份。
     * MIN_VALUE：year对象能表示的最小年份。
     */
    @Test
    public void test01(){
        System.out.println(Year.MAX_VALUE); // 输出 999999999
        System.out.println(Year.MIN_VALUE); // 输出 -999999999
    }
}

class YearDemo01{
    /**
     * from(TemporalAccessor temporal)
     * 作用：从其他含有年份数据的时间对象中获取yearMonth对象。
     */
    @Test
    public void test01(){
        LocalDate date01 = LocalDate.parse("2023-01-01");
        System.out.println(Year.from(date01));
    }

    /**
     * isLeap(long year)
     * 作用：判断是否时闰年。
     */
    @Test
    public void test02(){
        System.out.println(Year.isLeap(2000)); // 输出 true
        System.out.println(Year.isLeap(2023)); // 输出 false
    }

    /**
     * now()
     * 作用：从操作系统获取年份数据。
     *
     * now(Clock clock)
     * 作用：获取某个时区此刻的年份数据。
     *
     * now(ZoneId zone)
     * 作用：从clock对象获取年份数据。clock对象有时区的概念，所以获取的是跟地区相关的数据。
     */
    @Test
    public void test03(){
        Year year01 = Year.now();
        System.out.println(year01); // 输出 2023

        ZoneId zoneId01 = ZoneId.of("-18:00");
        Year year02 = Year.now(zoneId01);
        System.out.println(year02); // 输出 2023

        Instant instant01 = Instant.parse("2023-04-01T05:00:00Z");
        ZoneId zoneId02 = ZoneId.of("America/Los_Angeles");
        Clock fixedClock01 = Clock.fixed(instant01, zoneId02);
        Year year03 = Year.now(fixedClock01);
        System.out.println(year03); // 输出 2023
    }

    /**
     * of(int isoYear)
     * 作用：获得一个year的实例。
     */
    @Test
    public void test04(){
        System.out.println(Year.of(2023)); // 输出 2023
    }

    /**
     * parse(CharSequence text)
     * parse(CharSequence text, DateTimeFormatter formatter)
     * 作用：将字符串解析成year对象，默认格式yyyy，formatter用来指定字符串的格式。
     */
    @Test
    public void test05(){
        System.out.println(Year.parse("2023")); // 输出 2023

        DateTimeFormatter df01 = DateTimeFormatter.ofPattern("yyyy年");
        System.out.println(Year.parse("2023年", df01)); // 输出 2023
    }
}

class YearDemo02{

    /**
     * atDay(int dayOfYear)
     * atMonthDay(MonthDay monthDay)
     * 作用：补充月日数据，生成localDate对象。
     */
    @Test
    public void test01(){
        Year year01 = Year.of(2023);
        LocalDate date01 = year01.atDay(32);
        System.out.println(date01); // 输出 2023-02-01

        MonthDay monthDay01 = MonthDay.parse("--01-01");
        LocalDate date02 = year01.atMonthDay(monthDay01);
        System.out.println(date02); // 输出 2023-01-01
    }

    /**
     * atMonth(int month)
     * atMonth(Month month)
     * 作用：补充月份数据，生成yearMonth对象。
     */
    @Test
    public void test02(){
        Year year01 = Year.of(2023);
        YearMonth yearMonth01 = year01.atMonth(1);
        System.out.println(yearMonth01); // 输出 2023-01-01

        YearMonth yearMonth02 = year01.atMonth(Month.JANUARY);
        System.out.println(yearMonth02); // 输出 2023-01-01
    }

    /**
     * isLeap()
     * 作用：判断是否是闰年。
     *
     * isValidMonthDay(MonthDay monthDay)
     * 作用：检测月份和日期在该年份是否有效。
     */
    @Test
    public void test03(){
        Year year01 = Year.of(2000);
        Year year02 = Year.of(2023);
        System.out.println(year01.isLeap()); // 输出 true
        System.out.println(year02.isLeap()); // 输出 false

        System.out.println(year01.isValidMonthDay(MonthDay.parse("--02-29"))); // 输出 true
        System.out.println(year02.isValidMonthDay(MonthDay.parse("--02-29"))); // 输出 false
    }

    /**
     * length()
     * 作用：获取年份的天数。
     */
    @Test
    public void test04(){
        Year year01 = Year.of(2023);
        Year year02 = Year.of(2000);
        System.out.println(year01.length()); // 输出 365
        System.out.println(year02.length()); // 输出 366
    }
}